/*
 * Copyright 2020 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#include "src/gpu/ganesh/ops/GrSimpleMeshDrawOpHelperWithStencil.h"

GrSimpleMeshDrawOpHelperWithStencil::GrSimpleMeshDrawOpHelperWithStencil(GrProcessorSet *processorSet, GrAAType aaType,
    const GrUserStencilSettings *stencilSettings, InputFlags inputFlags)
    : INHERITED(processorSet, aaType, inputFlags),
      fStencilSettings(stencilSettings ? stencilSettings : &GrUserStencilSettings::kUnused)
{}

GrDrawOp::FixedFunctionFlags GrSimpleMeshDrawOpHelperWithStencil::fixedFunctionFlags() const
{
    GrDrawOp::FixedFunctionFlags flags = INHERITED::fixedFunctionFlags();
    if (fStencilSettings != &GrUserStencilSettings::kUnused) {
        flags |= GrDrawOp::FixedFunctionFlags::kUsesStencil;
    }
    return flags;
}

GrProcessorSet::Analysis GrSimpleMeshDrawOpHelperWithStencil::finalizeProcessors(const GrCaps &caps,
    const GrAppliedClip *clip, GrClampType clampType, GrProcessorAnalysisCoverage geometryCoverage,
    SkPMColor4f *geometryColor, bool *wideColor)
{
    GrProcessorAnalysisColor color = *geometryColor;
    auto result = this->finalizeProcessors(caps, clip, clampType, geometryCoverage, &color);
    color.isConstant(geometryColor);
    if (wideColor) {
        *wideColor = !geometryColor->fitsInBytes();
    }
    return result;
}

bool GrSimpleMeshDrawOpHelperWithStencil::isCompatible(const GrSimpleMeshDrawOpHelperWithStencil &that,
    const GrCaps &caps, const SkRect &thisBounds, const SkRect &thatBounds, bool ignoreAAType) const
{
    return INHERITED::isCompatible(that, caps, thisBounds, thatBounds, ignoreAAType) &&
        fStencilSettings == that.fStencilSettings;
}

GrProgramInfo *GrSimpleMeshDrawOpHelperWithStencil::createProgramInfoWithStencil(const GrCaps *caps,
    SkArenaAlloc *arena, const GrSurfaceProxyView &writeView, bool usesMSAASurface, GrAppliedClip &&appliedClip,
    const GrDstProxyView &dstProxyView, GrGeometryProcessor *gp, GrPrimitiveType primType,
    GrXferBarrierFlags renderPassXferBarriers, GrLoadOp colorLoadOp)
{
    return CreateProgramInfo(caps, arena, writeView, usesMSAASurface, std::move(appliedClip), dstProxyView, gp,
        this->detachProcessorSet(), primType, renderPassXferBarriers, colorLoadOp, this->pipelineFlags(),
        this->stencilSettings());
}

#if defined(GR_TEST_UTILS)
SkString GrSimpleMeshDrawOpHelperWithStencil::dumpInfo() const
{
    SkString result = INHERITED::dumpInfo();
    result.appendf("Stencil settings: %s\n", (fStencilSettings ? "yes" : "no"));
    return result;
}
#endif
